package com.ytfs;

import com.ytfs.entity.Customer;
import com.ytfs.utils.JpaUtil;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

/**
 * @Classname test
 * @Description TODO(JPA测试)
 * @Date 2020/4/28 22:58
 * @Created by ytfs
 */


public class test {

    /**
     * 保存客户
     */
    @Test
    public void testSave() {
       /* //创建实体类的工厂管理对象
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");

        //创建实体类管理对象
        EntityManager entityManager = factory.createEntityManager();*/

        EntityManager entityManager = JpaUtil.getEM();
        //开启事务
        entityManager.getTransaction().begin();
        //创建一个对象
        Customer customer = new Customer();
        customer.setCustName("张三");
        customer.setCustAddress("重庆市沙坪坝区");
        //保存对象
        entityManager.persist(customer);

        //提交事务
        entityManager.getTransaction().commit();

        //释放资源
        entityManager.close();
        //factory.close();   利用工具类之后就不用关闭工厂对象,因为线程安全只需要一个,后面的还会一直用
    }


    /**
     * @throws
     * @description find方式通过Id查询
     * @author 雨听风说
     * @updateTime 2020/4/29 13:03
     * 使用find方法查询：
     * 1.查询的对象就是当前客户对象本身
     * 2.在调用find方法的时候，就会发送sql语句查询数据库
     * <p>
     * 立即加载
     */
    @Test
    public void testFind() {

        //通过工具类获取实体类管理对象
        EntityManager em = JpaUtil.getEM();

        //获取事务对象
        EntityTransaction tx = em.getTransaction();
        //开启事务
        tx.begin();

        //通过实体类管理对象查询
        Customer customer = em.find(Customer.class, 1L);

        //customer.soutv
        System.out.println("customer = " + customer);

        //提交事务
        tx.commit();

        //释放资源
        em.close();
    }


    /**
     * @param
     * @return
     * @throws
     * @description 通过事务管理对象的get方式通过Id查询
     * @author 雨听风说
     * @updateTime 2020/4/29 13:13
     * getReference方法
     * 1.获取的对象是一个动态代理对象
     * 2.调用getReference方法不会立即发送sql语句查询数据库
     * * 当调用查询结果对象的时候，才会发送查询的sql语句：什么时候用，什么时候发送sql语句查询数据库
     * <p>
     * 延迟加载（懒加载）
     * * 得到的是一个动态代理对象
     * * 什么时候用，什么使用才会查询
     */

    @Test
    public void testGetRefrence() {

        //通过工具类获取实体类管理对象
        EntityManager em = JpaUtil.getEM();

        //获取事务对象并开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        //通过实体类对象查询
        Customer customer = em.getReference(Customer.class, 1L);

        System.out.println("customer = " + customer);

        //提交事务
        tx.commit();

        //释放资源
        em.close();
    }

    /**
     * @param
     * @return
     * @throws
     * @description 删除对象
     * @author 雨听风说
     * @updateTime 2020/4/29 13:17
     */
    @Test
    public void testRemove() {

        //通过工具类获取实体类管理对象
        EntityManager em = JpaUtil.getEM();

        //获取事务对象并开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        //通过实体类对象删除
        //i   通过id查询需要删除的对象
        Customer customer = em.find(Customer.class, 1L);
        //ii  调用remove方法,传入需要删除的对象
        em.remove(customer);
        //提交事务
        tx.commit();

        //释放资源
        em.close();


    }
    /**
     * @param
     * @return
     * @throws
     * @description 更新对象
     * @author 雨听风说
     * @updateTime 2020/4/29 13:17
     */
    @Test
    public void testUpdate() {

        //通过工具类获取实体类管理对象
        EntityManager em = JpaUtil.getEM();

        //获取事务对象并开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        //通过实体类对象更新
        //i   通过id查询需要更新的对象
        Customer customer = em.find(Customer.class, 2L);
        customer.setCustName("电动小马达");

        //ii  调用merge方法,传入需要更新的对象
        em.merge(customer);

        //提交事务
        tx.commit();

        //释放资源
        em.close();
    }
}
